关于python:tkinter:将鼠标滚轮绑定到滚动条 您所在的位置:网站首页 python frame 滚动条 关于python:tkinter:将鼠标滚轮绑定到滚动条

关于python:tkinter:将鼠标滚轮绑定到滚动条

2024-07-16 03:31| 来源: 网络整理| 查看: 265

我有这个可滚动框架(实际上是画布内部的框架)。

12345678910111213141516import Tkinter as tk class Scrollbarframe():     def __init__(self, parent,xsize,ysize,xcod,ycod):         def ScrollAll(event):                 canvas1.configure(scrollregion=canvas1.bbox("all"),width=xsize,height=ysize,bg='white')         self.parent=parent         self.frame1=tk.Frame(parent,bg='white')         self.frame1.place(x=xcod,y=ycod)         canvas1=tk.Canvas(self.frame1)         self.frame2=tk.Frame(canvas1,bg='white',relief='groove',bd=1,width=1230,height=430)         scrollbar1=tk.Scrollbar(self.frame1,orient="vertical",command=canvas1.yview)         canvas1.configure(yscrollcommand=scrollbar1.set)         scrollbar1.pack(side="right",fill="y")         canvas1.pack(side="left")         canvas1.create_window((0,0),window=self.frame2,anchor='nw')         self.frame2.bind("",ScrollAll)

我想将鼠标滚轮绑定到滚动条,以便用户可以向下滚动框架,而不必使用滚动条上的箭头按钮。 环顾四周后,我像这样向我的canvas1添加了绑定

1self.frame1.bind("", self.OnMouseWheel)

这是功能:

123def OnMouseWheel(self,event):     self.scrollbar1.yview("scroll",event.delta,"units")     return"break"

但是当我使用鼠标滚轮时,滚动条不会移动。 谁能帮我这个? 我想要的就是用户使用鼠标滚轮(在框区域内/滚动条上)时,画布应自动向上或向下滚动。

也许最简单的解决方案是为鼠标滚轮建立全局绑定。然后,无论鼠标下方是哪个窗口小部件,还是具有键盘焦点的窗口小部件,它都将触发。然后,您可以无条件地滚动画布,或者可以聪明地找出应该滚动的窗口。

例如,在Windows上,您将执行以下操作:

12345self.canvas = Canvas(...) self.canvas.bind_all("", self._on_mousewheel) ... def _on_mousewheel(self, event):     self.canvas.yview_scroll(-1*(event.delta/120),"units")

请注意,self.canvas.bind_all有点误导-您更正确地应该调用root.bind_all,但我不知道您定义根窗口的方式或方式。无论如何,这两个调用是同义词。

平台差异:

在Windows上,您绑定到,并且需要将event.delta除以120(或其他一些因素,具体取决于滚动的速度) 在OSX上,您绑定到,并且需要使用event.delta而无需进行修改 在X11系统上,您需要绑定到和,并且需要将event.delta除以120(或其他一些因素,具体取决于您要滚动的速度)

还有更多精致的解决方案,涉及虚拟事件并确定哪个窗口具有焦点或在鼠标下方,或者通过绑定传递画布窗口引用,但是希望这可以帮助您入门。

相关讨论 我尝试使用此程序(此处为Linux),但无法使其正常工作,直到我注意到-我想知道-event.delta始终为零。通过简单地调用yview_scroll(direction," units")即可解决 @Bryan Oakley-如果应用程序中只有一个滚动画布,则上述方法可以正常工作。但是,如果有两个或多个,如何限制滚动到一个或另一个? @JDM:可以使用winfo_containing找出光标下方的画布,然后滚动该画布。 @BryanOakley:好的,我想我明白了。我从另一个方向进行了研究,使用小部件和事件触发.bind_all和.unbind调用。真正的麻烦是弄清楚为什么Tkinter接受.bind_all的回调,但抱怨说它需要一个字符串来代替.unbind。 (Id已经排除了全局unbind或unbind_all,因为我不想破坏可能存在的其他绑定。)无论如何,在MUCH搜索之后,我终于找到了一篇显示正确字符串语法的文章:mail.python.org/pipermail// tkinter-discuss / 2012-May / 003152.h tml 根据您的回答(略作修改:self.canvas.bind_all(, lambda event: self.canvas.yview_scroll(int(-1*(event.delta120)),"units"))),我在此一类代码中发现了很多价值。使用Python 3.4,如果数字不是强制转换为int,则解释器将抛出_tkinter.TclError: expected integer but got"1.0"。

根据@BryanOakley的答案,这是一种仅滚动聚焦小部件(即,您当前将鼠标光标悬停在其上的小部件)的方法。

绑定到位于画布内部的可滚动框架上发生的和事件,方法如下(scrollframe是画布内部的框架):

123456789101112131415    ....     self.scrollframe.bind('', self._bound_to_mousewheel)     self.scrollframe.bind('', self._unbound_to_mousewheel)     return def _bound_to_mousewheel(self, event):     self.canv.bind_all("", self._on_mousewheel)   def _unbound_to_mousewheel(self, event):     self.canv.unbind_all("") def _on_mousewheel(self, event):     self.canv.yview_scroll(int(-1*(event.delta/120)),"units") 相关讨论 这应该是选择的答案,因为它提供了大多数应用程序将需要的有针对性的方法。 谢谢,这种方法对我有用。即使鼠标没有悬停在其上方,我的可滚动框架仍在滚动,这使我的树状视图滚动条紧紧固定在其旁边的列中,该滚动条具有自己的内置滚动条。 优秀。为我工作。

为了摆脱奇怪的因素120,我们可以看看event.delta值的符号。这使得在Windows,Linux和Mac OS下使用同一处理程序变得容易。

12345678910111213141516171819202122# Mouse wheel handler for Mac, Windows and Linux # Windows, Mac: Binding to is being used # Linux: Binding to and is being used def MouseWheelHandler(event):     global count     def delta(event):         if event.num == 5 or event.delta


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有